From f91d28bfdc9edecac056f0975243afe7ec61e689 Mon Sep 17 00:00:00 2001 From: tsteven4 <13596209+tsteven4@users.noreply.github.com> Date: Wed, 5 Feb 2020 12:47:03 -0700 Subject: [PATCH] use rounding when interpolating time in arcdist filter. (#495) eliminate uneccessary casting away of const. reduce variable scope. --- arcdist.cc | 41 +++++++++++++++++++++++--------------- arcdist.h | 6 ++++-- reference/arc-project3.gpx | 2 +- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/arcdist.cc b/arcdist.cc index 3c2d3107c..edca0795c 100644 --- a/arcdist.cc +++ b/arcdist.cc @@ -19,15 +19,22 @@ */ +#include // for round +#include // for printf, sscanf +#include // for strtod +#include // for strchr, strlen, strncmp, strspn + +#include // for QByteArray +#include // for QString +#include // for foreach, qPrintable, qint64 #include "defs.h" #include "arcdist.h" -#include "grtcirc.h" +#include "gbfile.h" // for gbfclose, gbfgetstr, gbfopen, gbfile +#include "grtcirc.h" // for RAD, gcdist, linedistprj, radtomi +#include "src/core/datetime.h" // for DateTime +#include "src/core/logging.h" // for Fatal -#include -#include -#include // strtod -#include #if FILTERS_ENABLED #define MYNAME "Arc filter" @@ -36,14 +43,15 @@ void ArcDistanceFilter::arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) { - static Waypoint* arcpt1 = nullptr; - double prjlat, prjlon, frac; + static const Waypoint* arcpt1 = nullptr; + double prjlat; + double prjlon; + double frac; if (arcpt2 && arcpt2->latitude != BADVAL && arcpt2->longitude != BADVAL && (ptsopt || (arcpt1 && (arcpt1->latitude != BADVAL && arcpt1->longitude != BADVAL)))) { foreach (Waypoint* waypointp, *global_waypoint_list) { - double dist; extra_data* ed; if (waypointp->extra_data) { ed = (extra_data*) waypointp->extra_data; @@ -52,12 +60,13 @@ void ArcDistanceFilter::arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) ed->distance = BADVAL; } if (ed->distance == BADVAL || projectopt || ed->distance >= pos_dist) { + double dist; if (ptsopt) { dist = gcdist(RAD(arcpt2->latitude), RAD(arcpt2->longitude), RAD(waypointp->latitude), RAD(waypointp->longitude)); - prjlat = arcpt2->latitude; + prjlat = arcpt2->latitude; prjlon = arcpt2->longitude; frac = 1.0; } else { @@ -87,14 +96,14 @@ void ArcDistanceFilter::arcdist_arc_disp_wpt_cb(const Waypoint* arcpt2) ed->prjlongitude = prjlon; ed->frac = frac; ed->arcpt1 = arcpt1; - ed->arcpt2 = const_cast(arcpt2); + ed->arcpt2 = arcpt2; } } waypointp->extra_data = ed; } } } - arcpt1 = const_cast(arcpt2); + arcpt1 = arcpt2; } void ArcDistanceFilter::arcdist_arc_disp_hdr_cb(const route_head*) @@ -184,12 +193,12 @@ void ArcDistanceFilter::process() wp->SetCreationTime(ed->arcpt2->GetCreationTime()); } else { // Apply the multiplier to the difference between the times - // of the two points. Add that to the first for the + // of the two points. Add that to the first for the // interpolated time. - int scaled_time = ed->frac * - ed->arcpt1->GetCreationTime().msecsTo(ed->arcpt2->GetCreationTime()); - QDateTime new_time(ed->arcpt1->GetCreationTime().addMSecs(scaled_time)); - wp->SetCreationTime(new_time); + qint64 span = + ed->arcpt1->GetCreationTime().msecsTo(ed->arcpt2->GetCreationTime()); + qint64 offset = std::round(ed->frac * span); + wp->SetCreationTime(ed->arcpt1->GetCreationTime().addMSecs(offset)); } } if (global_opts.debug_level >= 1) { diff --git a/arcdist.h b/arcdist.h index ef12f39c3..ba0be89d4 100644 --- a/arcdist.h +++ b/arcdist.h @@ -51,9 +51,11 @@ private: struct extra_data { double distance; - double prjlatitude, prjlongitude; + double prjlatitude; + double prjlongitude; double frac; - Waypoint* arcpt1, * arcpt2; + const Waypoint* arcpt1; + const Waypoint* arcpt2; }; QVector args = { diff --git a/reference/arc-project3.gpx b/reference/arc-project3.gpx index 45df977c2..b31797513 100644 --- a/reference/arc-project3.gpx +++ b/reference/arc-project3.gpx @@ -23,7 +23,7 @@ valley - + wpt1 wpt1 wpt1 -- 2.30.2